.section .init_vector, "ax"
.code 32
.align 5

.global _start
_start:
    b       Reset_Handler          @ 0x00: 复位
    b       Undefined_Handler      @ 0x04: 未定义指令
    b       SVC_Handler            @ 0x08: 软件中断
    b       PrefetchAbort_Handler  @ 0x0C: 预取指中止
    b       DataAbort_Handler      @ 0x10: 数据中止
    nop                            @ 0x14: 保留
    ldr     pc, =IRQ_Handler       @ 0x18: IRQ 中断
    ldr     pc, =FIQ_Handler       @ 0x1C: FIQ 中断

Reset_Handler:
    @ 设置各种模式下的堆栈指针
    cpsid   i                     @ 禁用中断
    
    @ 设置未定义模式堆栈
    cps     #0x1B                 @ 切换到未定义模式
    ldr     sp, =0x68000000
    
    @ 设置中止模式堆栈
    cps     #0x17                 @ 切换到中止模式
    ldr     sp, =0x67FF0000
    
    @ 设置 IRQ 模式堆栈
    cps     #0x12                 @ 切换到 IRQ 模式
    ldr     sp, =0x67FE0000
    
    @ 设置 FIQ 模式堆栈
    cps     #0x11                 @ 切换到 FIQ 模式
    ldr     sp, =0x67FD0000
    
    @ 设置系统模式堆栈
    cps     #0x1F                 @ 切换到系统模式
    ldr     sp, =0x67FC0000
    
    @ 跳转到 C 主函数
    bl      system_boot_init
    
    @ 如果 main 返回，则进入循环
halt:
    b       halt

@ 其他异常处理程序
Undefined_Handler:
    b       Undefined_Handler

SVC_Handler:
    b       SVC_Handler

PrefetchAbort_Handler:
    b       PrefetchAbort_Handler

DataAbort_Handler:
    b       DataAbort_Handler

IRQ_Handler:
    @ IRQ 处理代码
    b       IRQ_Handler

FIQ_Handler:
    @ FIQ 处理代码
    b       FIQ_Handler

